package day27

//颠倒给定的 32 位无符号整数的二进制位。
//
//
//
// 示例 1：
//
// 输入: 00000010100101000001111010011100
//输出: 00111001011110000010100101000000
//解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596，
//      因此返回 964176192，其二进制表示形式为 00111001011110000010100101000000。
//
// 示例 2：
//
// 输入：11111111111111111111111111111101
//输出：10111111111111111111111111111111
//解释：输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293，
//      因此返回 3221225471 其二进制表示形式为 10101111110010110010011101101001。
//
//
//
// 提示：
//
//
// 请注意，在某些语言（如 Java）中，没有无符号整数类型。在这种情况下，输入和输出都将被指定为有符号整数类型，并且不应影响您的实现，因为无论整数是有符号的还是无符号的，其内部的二进制表示形式都是相同的。
// 在 Java 中，编译器使用二进制补码记法来表示有符号整数。因此，在上面的 示例 2 中，输入表示有符号整数 -3，输出表示有符号整数 -1073741825。
//
//
//
//
// 进阶:
//如果多次调用这个函数，你将如何优化你的算法？
// Related Topics 位运算
/*
	思路1:位运算、移位操作、给定一个新的值res,
	因为是32位、所以要遍历32次、每遍历一次、将num&1的结果添加到res上
	然后num右移
	核心思想:num&1取的就是最低位的值、将res左移之后、加上这个最低位的值
	即表示颠倒之后的部分值、直到32位遍历完成
	todo 注意:这里不能以右移之后的结果是0作为退出条件、因为这样有可能没有补足0、所以必须要完成32次遍历
*/
//leetcode submit region begin(Prohibit modification and deletion)
func reverseBits(num uint32) uint32 {
	var res uint32 = 0
	for i := 0; i < 32; i++ {
		res <<= 1
		res += num & 1	// res左移、然后加上num最低位的值
		num >>= 1
	}
	return res
}
//leetcode submit region end(Prohibit modification and deletion)

